package br.com.prontuario.faces;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;

import br.com.prontuario.entidade.Proprietario;
import br.com.prontuario.entidade.Telefone;
import br.com.prontuario.enumgeral.Sexo;
import br.com.prontuario.enumgeral.TipoProprietario;
import br.com.prontuario.enumgeral.TipoTelefone;
import br.com.prontuario.logica.contract.DefaultLogicaContract;
import br.com.prontuario.logica.contract.ProprietarioLogicaContract;
import br.com.prontuario.logica.contract.TelefoneLogicaContract;
import br.com.prontuario.util.FacesUtil;
import br.com.prontuario.util.StringUtil;

@ManagedBean(name="proprietarioFaces")
@ViewScoped
public class ProprietarioFaces extends FacesUtil {
	
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Proprietario> logicaProprietario;
	
	@ManagedProperty(value = "#{telefoneLogica}")
	private TelefoneLogicaContract logicaTelefone;
	
	@ManagedProperty(value = "#{proprietarioLogica}")
	private ProprietarioLogicaContract proprietarioLogica;
	
	
	
	private Proprietario proprietario = new Proprietario();
	private List<Proprietario> listaProprietario = new ArrayList<>();
	private String proprietarioBusca;

	private Boolean isPopup = false;
	
	private String nomeTemplate;
	
	private List<Telefone> listaTelefones = new ArrayList<>();
	
	public ProprietarioFaces() {
		Boolean popup = (Boolean) getSession().getAttribute("isPopup");
		if (popup != null) {
			isPopup = popup;
		}
		this.adicionarTelefones();
	}
	
	@PostConstruct
	public void init() {
		this.buscarProprietario();
		if (isPopup != null && isPopup) {
			nomeTemplate = "/templates/templateDialog.xhtml";
		} else {
			nomeTemplate = "/templates/template.xhtml";
		}

	}
	
	@PreDestroy
	public void finalizar() {
		getSession().setAttribute("proprietarioConsulta", null);
		getSession().setAttribute("isPopup", null);
	}

	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaProprietario.adicionar(proprietario);
				logicaTelefone.salvarTelefones(listaTelefones);
				
				adicionarMensagem("Proprietário adicionado com sucesso");
				this.buscarProprietario();
				fecharModal("dialogProprietario");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Proprietário");
		}
	}
	
	public void prepararAdicionar() {
		this.proprietario = new Proprietario();
		this.listaTelefones.clear();
		
		this.proprietario.setTipoProprietario(TipoProprietario.FISICA);

		abrirModal("dialogProprietario");
	}
	
	public void selecionarRegistro(Long idEntidade, String popupAbrir) {
		try {
			Proprietario proprietarioPorId = proprietarioLogica.obterProprietarioPorId(idEntidade);
			this.proprietario = proprietarioPorId;
			listaTelefones = logicaTelefone.buscarTelefonesProprietario(idEntidade);
			
			if (popupAbrir.equalsIgnoreCase("dialogProprietario")) {
				abrirModal("dialogProprietario");
			} else if (popupAbrir.equalsIgnoreCase("dialogExcluir")){
				abrirModal("dialogExcluir");
			} else if (popupAbrir.equalsIgnoreCase("dialogTelefones")) {
				abrirModal("dialogTelefones");
			} else if (popupAbrir.equalsIgnoreCase("buscarAnimais")) {
				getSession().setAttribute("proprietarioConsulta", proprietario);
		    	abrirDialogFramework("animal", true);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaProprietario.editar(this.proprietario);
				logicaTelefone.salvarTelefones(listaTelefones);
				adicionarMensagem("Proprietário editado com sucesso");
				fecharModal("dialogProprietario");
				this.buscarProprietario();
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Proprietário");
		}
	}
	
	public void remover() {
		try {
			List<Telefone> listaTelefones = logicaTelefone.buscarTelefonesProprietario(this.proprietario.getId());
			for (Telefone itemTelefone : listaTelefones) {
				logicaTelefone.removerTelefones(itemTelefone);
			}
			logicaProprietario.remover(Proprietario.class, this.proprietario.getId());
			adicionarMensagem("Proprietário removido com sucesso");
			fecharModal("dialogExcluir");
			this.buscarProprietario();
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Proprietário");
		}
	}
	
	public void buscarProprietario() {
		if (listaProprietario != null) {
			this.listaProprietario.clear();
		}
		String campoBuscaOrdenacao = "nome";
		try {
			if (!StringUtil.textoPreenchido(proprietarioBusca)) {
				this.listaProprietario =  logicaProprietario.buscarTodos(Proprietario.class, campoBuscaOrdenacao);
			} else {
				this.listaProprietario = logicaProprietario.buscarPorCampo(Proprietario.class, campoBuscaOrdenacao, proprietarioBusca, campoBuscaOrdenacao);
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		
		if (!StringUtil.textoPreenchido(this.proprietario.getNome())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		
		if (StringUtil.textoPreenchido(this.proprietario.getEmail()) && !StringUtil.validaEmail(this.proprietario.getEmail())) {
			adicionarMensagem("E-mail informado é inválido");
			valido = false;
		}
		
		return valido;
	}
	
	public List<TipoTelefone> getTiposTelefone() {
		return Arrays.asList(TipoTelefone.values());
	}
	
	public List<Proprietario> autoComplete(String query) {
		List<Proprietario> suggestions = new ArrayList<>();
		if (query.length() > 2) {
			try {
				suggestions = logicaProprietario.buscarPorCampo(Proprietario.class, "nome", query, "nome");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return suggestions;
    }
	
	public void adicionarTelefones() {
		Telefone telefone = new Telefone();
		telefone.setTipoTelefone(TipoTelefone.RESIDENCIAL);
		telefone.setProprietario(this.proprietario);
		
		listaTelefones.add(telefone);
	}
	
	public void removerTelefone(Telefone telefone) {
		try {
			if (telefone.getId() != null) {
				logicaTelefone.remover(Telefone.class, telefone.getId());
				listaTelefones = logicaTelefone.buscarTelefonesProprietario(this.proprietario.getId());
			} else {
				listaTelefones.remove(telefone);
			}
		} catch (Exception e) {
			System.out.println("Problema");
		}
		
	}
	
	public List<Sexo> getListaSexo() {
		List<Sexo> listaSexo = new ArrayList<>();
		listaSexo.add(Sexo.FEMININO);
		listaSexo.add(Sexo.MASCULINO);
		
		return listaSexo;
	}
	
	public List<TipoProprietario> getListaTipoProprietario() {
		List<TipoProprietario> listaTipoProprietario = Arrays.asList(TipoProprietario.values());
		return listaTipoProprietario;
	}
	
    public void selecionarProprietario() {
    	abrirDialogFramework("proprietario", true);
    }

	public void selecionarNoDialog(Proprietario proprietario) {
        RequestContext.getCurrentInstance().closeDialog(proprietario);
    }
	

	public Proprietario getProprietario() {
		return proprietario;
	}

	public void setProprietario(Proprietario proprietario) {
		this.proprietario = proprietario;
	}

	public List<Proprietario> getListaProprietario() {
		return listaProprietario;
	}

	public void setListaProprietario(List<Proprietario> listaProprietario) {
		this.listaProprietario = listaProprietario;
	}

	public String getProprietarioBusca() {
		return proprietarioBusca;
	}

	public void setProprietarioBusca(String proprietarioBusca) {
		this.proprietarioBusca = proprietarioBusca;
	}

	public void setLogicaProprietario(DefaultLogicaContract<Proprietario> logicaProprietario) {
		this.logicaProprietario = logicaProprietario;
	}

	public Boolean getIsPopup() {
		return isPopup;
	}

	public void setIsPopup(Boolean isPopup) {
		this.isPopup = isPopup;
	}

	public void setLogicaTelefone(TelefoneLogicaContract logicaTelefone) {
		this.logicaTelefone = logicaTelefone;
	}

	public List<Telefone> getListaTelefones() {
		return listaTelefones;
	}

	public void setListaTelefones(List<Telefone> listaTelefones) {
		this.listaTelefones = listaTelefones;
	}

	public String getNomeTemplate() {
		return nomeTemplate;
	}

	public void setNomeTemplate(String nomeTemplate) {
		this.nomeTemplate = nomeTemplate;
	}

	public void setProprietarioLogica(ProprietarioLogicaContract proprietarioLogica) {
		this.proprietarioLogica = proprietarioLogica;
	}
	
	
}